package us.proyecto.canarios.actions.concursos;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.jboss.seam.ScopeType;
import org.jboss.seam.annotations.Begin;
import org.jboss.seam.annotations.FlushModeType;
import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.annotations.Scope;
import org.jboss.seam.annotations.datamodel.DataModel;
import org.jboss.seam.annotations.datamodel.DataModelSelectionIndex;
import org.jboss.seam.faces.FacesMessages;
import org.jboss.seam.log.Log;
import org.richfaces.component.html.HtmlTree;
import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.model.TreeNode;

import us.proyecto.canarios.actions.admin.AutenticacionAction;
import us.proyecto.canarios.actions.usuarios.ConsultaUsuarioAction;
import us.proyecto.canarios.dao.ConcursoDAO;
import us.proyecto.canarios.dao.DiccionarioDAO;
import us.proyecto.canarios.dao.PajarosDAO;
import us.proyecto.canarios.dao.UsuarioDAO;
import us.proyecto.canarios.domain.Asociacion;
import us.proyecto.canarios.domain.Concurso;
import us.proyecto.canarios.domain.Criador;
import us.proyecto.canarios.domain.Incidencia;
import us.proyecto.canarios.domain.Pajaro;
import us.proyecto.canarios.domain.Puntuacion;
import us.proyecto.canarios.domain.Tipo;
import us.proyecto.canarios.domain.Usuario;

@Name("gestionCanarioAso")
@Scope(ScopeType.SESSION)
public class GestionCanarioAsoAction {

	@Logger
	Log log;

	private String nombre;
	private Asociacion asociacion;
	private Date fechaInicio;
	private Date fechaFin;

	@In(create = true)
	private UsuarioDAO usuarioDAO;

	@DataModel("listaConcursosAsoc")
	private List<Concurso> listaConcursosAsoc;
	@DataModelSelectionIndex("listaConcursosAsoc")
	private int indexAsoc;

	private List<Tipo> listaTipos;

	private List<Asociacion> listaAsociaciones;

	private List<Pajaro> listaPajaros;

	@In(create = true)
	private ConcursoDAO concursoDAO;

	@In(create = true)
	private DiccionarioDAO diccionariosDAO;

	@In(create = true)
	private PajarosDAO pajarosDAO;

	private List<Criador> listaCriadores;

	private Puntuacion puntuacion;

	@In
	private Usuario user;

	private Concurso concurso;

	@In(create = true)
	private AutenticacionAction autenticacion;

	@In(create = true)
	private ConsultaPajarosAction consultaPajaro;

	// private Tipo tipo;

	private Pajaro pajaro;

	private List<Incidencia> listaIncidencias;

	private List<Incidencia> listaIncidenciasElim;

	private boolean consulta;

	private Criador criador;


	public String getNombre() {
		return nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	public void buscar() {
		String where = new String(" 1 = 1 ");
		where = where + " and c.asociacion.idAsociacion = "
				+ user.getAsociacion().getIdAsociacion();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		Date d = new Date();
		where = where + " and c.fechaInicio <= convert('" + sdf.format(d)
				+ " ', DATE) ";
		where = where + " and c.fechaFin >= convert('" + sdf.format(d)
				+ " ', DATE) ";
		listaConcursosAsoc = concursoDAO.getListByWhere(where);

	}

	public int getIndexAsox() {
		return indexAsoc;
	}

	public void setIndexAsoc(int index) {
		this.indexAsoc = index;
	}

	public String traduce(String s) {
		String res = "";
		if (s.equals("true")) {
			res = "Si";
		} else {
			res = "No";
		}
		return res;

	}

	public void gestion() {
		pajaro = new Pajaro();
		puntuacion = new Puntuacion();
		puntuacion.setPajaro(pajaro);
		pajaro.setPuntuaciones(new HashSet<Puntuacion>());
		pajaro.getPuntuaciones().add(puntuacion);
		listaCriadores = usuarioDAO.getCriadores();
		buscar();

	}

	@Begin(join = true, flushMode=FlushModeType.MANUAL)
	public String gestion(Concurso con) {
		if(con.getIdConcurso()!=0){
			concurso = con;
			pajaro = new Pajaro();
			criador = null;
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			puntuacion.setConcurso(con);
			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			listaCriadores = usuarioDAO.getCriadores();
			puntuacion.setNumJaula(concursoDAO.obtieneNumJaula(concurso));
			buscar();
			return "true";
		}
		return "false";

	}

	/**
	 * @return the asociacion
	 */
	public Asociacion getAsociacion() {
		return asociacion;
	}

	/**
	 * @param asociacion
	 *            the asociacion to set
	 */
	public void setAsociacion(Asociacion asociacion) {
		this.asociacion = asociacion;
	}

	/**
	 * @return the fechaInicio
	 */
	public Date getFechaInicio() {
		return fechaInicio;
	}

	/**
	 * @param fechaInicio
	 *            the fechaInicio to set
	 */
	public void setFechaInicio(Date fechaInicio) {
		this.fechaInicio = fechaInicio;
	}

	/**
	 * @return the fechaFin
	 */
	public Date getFechaFin() {
		return fechaFin;
	}

	/**
	 * @param fechaFin
	 *            the fechaFin to set
	 */
	public void setFechaFin(Date fechaFin) {
		this.fechaFin = fechaFin;
	}

	/**
	 * @return the listaConcursos
	 */
	public List<Concurso> getListaConcursosAsoc() {
		return listaConcursosAsoc;
	}

	/**
	 * @param listaConcursos
	 *            the listaConcursos to set
	 */
	public void setListaConcursosAsoc(List<Concurso> listaConcursos) {
		this.listaConcursosAsoc = listaConcursos;
	}

	/**
	 * @return the listaAsociaciones
	 */
	public List<Asociacion> getListaAsociaciones() {
		return listaAsociaciones;
	}

	/**
	 * @param listaAsociaciones
	 *            the listaAsociaciones to set
	 */
	public void setListaAsociaciones(List<Asociacion> listaAsociaciones) {
		this.listaAsociaciones = listaAsociaciones;
	}

	public List<Tipo> getListaTipos() {
		if (listaTipos == null) {
			listaTipos = diccionariosDAO.getListaTipos();
		}
		return listaTipos;
	}

	public void setListaTipos(List<Tipo> listaTipos) {
		this.listaTipos = listaTipos;
	}

	public Usuario getUser() {
		return user;
	}

	public void setUser(Usuario usuario) {
		this.user = usuario;
	}

	public Concurso getConcurso() {
		return concurso;
	}

	public void setConcurso(Concurso concurso) {
		this.concurso = concurso;
	}

	/*
	 * public Tipo getTipo() { return tipo; }
	 *
	 * public void setTipo(Tipo tipo) { this.tipo = tipo; }
	 */

	public int getIndexAsoc() {
		return indexAsoc;
	}

	public void cambiarConcurso() {
		puntuacion.setConcurso(concurso);
		if (pajaro.getPuntuaciones() != null && concurso != null) {
			boolean enc = false;
			for (Puntuacion pun : pajaro.getPuntuaciones()) {
				if (pun.getConcurso().getIdConcurso() == concurso
						.getIdConcurso()) {
					puntuacion = pun;
					enc = true;
				}
			}
			if (!enc) {
				puntuacion = new Puntuacion();
				puntuacion.setPajaro(pajaro);
				puntuacion.setConcurso(concurso);
				pajaro.getPuntuaciones().add(puntuacion);
			}
		}
	}

	public void buscarPajaro() {
		Pajaro p = pajarosDAO.getPajaroByNumAnilla(pajaro.getNumAnilla());
		Pajaro aux = pajaro;
		Puntuacion punt = puntuacion;
		pajaro = p;
		if (pajaro != null && pajaro.getPuntuaciones() != null
				&& concurso != null) {
			boolean enc = false;
			for (Puntuacion pun : pajaro.getPuntuaciones()) {
				if (pun.getConcurso() != null && pun.getConcurso().getIdConcurso() == concurso
						.getIdConcurso()) {
					FacesMessages
							.instance()
							.add("Este pajaro ya se ha dado de alta en el concurso, sus datos solo se actualizarán");
					puntuacion = pun;
					enc = true;
				}
			}
			if (!enc) {
				puntuacion = new Puntuacion();
				puntuacion.setPajaro(pajaro);
				puntuacion.setConcurso(concurso);
				pajaro.getPuntuaciones().add(puntuacion);
			}
		} else {
			pajaro = aux;
			puntuacion = punt;
			//puntuacion.setPajaro(pajaro);
			//puntuacion.setConcurso(concurso);
			//pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			//pajaro.getPuntuaciones().add(puntuacion);
		}
	}

	public void buscarPajaros(){
		if(criador!=null){
			listaPajaros = new ArrayList<Pajaro>();
			if(criador.getPajaros()!=null){
				listaPajaros.addAll(criador.getPajaros());
			}
		}
	}

	public void guardar() {
		// pajaro.getPuntuaciones().add(puntuacion);
		if(pajaro != null) {
			if (pajaro.getIdPajaro() == 0) {
				if(criador!=null){
					pajaro.setCriador(criador);
					pajarosDAO.save(pajaro);
					FacesMessages.instance().add("Pájaro guardado correctamente");
				}else{
					FacesMessages.instance().add("Debe seleccionar un criador");
				}
			} else {
				pajarosDAO.update(pajaro);
				FacesMessages.instance().add("Pájaro actualizado correctamente");
			}
		}else{
			FacesMessages.instance().add("Debe seleccionar un pájaro");
		}

	}

	public void guardarIncidencia() {
		// pajaro.getPuntuaciones().add(puntuacion);
		for(Incidencia inc: listaIncidenciasElim){
			pajarosDAO.remover(inc);
		}
		puntuacion.setIncidencias(new HashSet<Incidencia>());
		Incidencia c = listaIncidencias.get(listaIncidencias.size()-1);
		listaIncidencias.remove(listaIncidencias.size()-1);
		puntuacion.getIncidencias().addAll(listaIncidencias);
		listaIncidencias.add(c);
		if (pajaro.getIdPajaro() == 0) {
			pajarosDAO.save(pajaro);
		} else {
			pajarosDAO.update(pajaro);
		}
		FacesMessages.instance().add("Incidencias guardadas correctamente");

	}

	public void guardarAnadir() {
		// pajaro.getPuntuaciones().add(puntuacion);
		if (pajaro.getIdPajaro() == 0) {
			pajarosDAO.save(pajaro);
			FacesMessages.instance().add("Pájaro guardado correctamente, puede añadir un nuevo pájaro si lo desea");
		} else {
			pajarosDAO.update(pajaro);
			FacesMessages.instance().add("Pájaro actualizado correctamente, puede añadir un nuevo pájaro si lo desea");
		}
		Criador c = pajaro.getCriador();
		gestion(concurso);
		pajaro.setCriador(c);
		gestion(concurso);



	}

	public List<Criador> getListaCriadores() {
		return listaCriadores;
	}

	public void setListaCriadores(List<Criador> listaCriadores) {
		this.listaCriadores = listaCriadores;
	}

	public Pajaro getPajaro() {
		return pajaro;
	}

	public void setPajaro(Pajaro pajaro) {
		this.pajaro = pajaro;
	}

	public Puntuacion getPuntuacion() {
		return puntuacion;
	}

	public void setPuntuacion(Puntuacion puntuacion) {
		this.puntuacion = puntuacion;
	}

	public String processSelection(NodeSelectedEvent event) {
		HtmlTree tree = (HtmlTree) event.getComponent();
		TreeNode currentNode = tree.getModelTreeNode(tree.getRowKey());
		if (currentNode.isLeaf()) {
			Concurso c = (Concurso) currentNode.getData();
			concurso = c;
			pajaro = new Pajaro();
			puntuacion = new Puntuacion();
			puntuacion.setPajaro(pajaro);
			pajaro.setPuntuaciones(new HashSet<Puntuacion>());
			pajaro.getPuntuaciones().add(puntuacion);
			listaCriadores = usuarioDAO.getCriadores();
			buscar();
			return "true";
		} else {
			return "false";
		}
	}

	public void selectPajaro(){
		puntuacion = consultaPajaro.getListaPajaros().get(consultaPajaro.getIndex());
		pajaro = puntuacion.getPajaro();
		listaIncidencias = new ArrayList<Incidencia>();
		listaIncidenciasElim = new ArrayList<Incidencia>();
		if(puntuacion.getIncidencias()!=null) {
			listaIncidencias.addAll(puntuacion.getIncidencias());
		}
		consulta = consultaPajaro.getConsulta();
		Incidencia nueva = new Incidencia();
		nueva.setNueva(true);
		nueva.setFecha(new Date());
		nueva.setObservaciones("");
		nueva.setPuntuacion(puntuacion);
		listaIncidencias.add(nueva);
	}

	public List<Incidencia> getListaIncidencias() {
		return listaIncidencias;
	}

	public void setListaIncidencias(List<Incidencia> listaIncidencias) {
		this.listaIncidencias = listaIncidencias;
	}

	public void eliminar(Incidencia inc){
		listaIncidenciasElim.add(inc);
		listaIncidencias.remove(inc);

	}
	public void annadir(){
		Incidencia nueva2 =listaIncidencias.get(listaIncidencias.size()-1);
		nueva2.setNueva(false);
		Incidencia nueva = new Incidencia();
		nueva.setNueva(true);
		nueva.setFecha(new Date());
		nueva.setObservaciones("");
		nueva.setPuntuacion(puntuacion);
		listaIncidencias.add(nueva);
	}

	public boolean isConsulta() {
		return consulta;
	}

	public void setConsulta(boolean consulta) {
		this.consulta = consulta;
	}

	public List<Pajaro> getListaPajaros() {
		return listaPajaros;
	}

	public void setListaPajaros(List<Pajaro> listaPajaros) {
		this.listaPajaros = listaPajaros;
	}

	public Criador getCriador() {
		return criador;
	}

	public void setCriador(Criador criador) {
		this.criador = criador;
	}
	public void vacio(){}


}
